package reflection;


import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射
 */
public class ReflectionQuestion {

    public static void main(String[] args) throws Exception {

        /*
            1)根据配置文件 re.properties 指定信息，创建Cat对象并调用方法hi
            2)通过外部文件配置，在不修改源码情况下，来控制程序，也符合设计模式的ocp原则
         */

        //使用Properties读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classFullPath = properties.get("classfullpath").toString();//reflection.Cat
        String methodName = properties.get("method").toString();//hi
        System.out.println("classFullPath: " + classFullPath);
        System.out.println("methodName: " + methodName);

        //传统方法没法创建对象
        //new classfullpath();

        //创建对象，利用反射机制
        //1.加载类，返回Class类型的对象 cls
        Class cls = Class.forName(classFullPath);
        //2.通过 cls 得到加载的类 reflection.Cat 的对象实例
        Object o = cls.newInstance();
        System.out.println("o的运行类型=" + o.getClass());   //运行类型
        //3.通过 cls 得到加载的类 reflection.Cat 的 methodName "hi"的方法对象
        //即：在反射中，可以把方法视为对象(万物都是对象)
        Method method = cls.getMethod(methodName);
        //4.通过method1调用方法：即通过方法对象来实现调用方法
        System.out.println("==================================");
        method.invoke(o);   //传统方法 对象.方法()，反射机制 方法.invoke(对象)




    }
}
